#pragma once

#include<iostream>
#include<fcntl.h>
#include<unistd.h>

#define DIE(code) do{exit(code);}while(0)

enum{
    USAGE_ERR = 1,
    SOCKET_ERR,
    BIND_ERR,
    LISTEN_ERR,
    EPOLL_CREATE_ERR,
    EPOLL_CTL_ERR
};

const int gbacklog = 8;

bool ParseOneLine(std::string& str, std::string* out, const std::string& sep)
{
    auto pos = str.find(sep);
    if(pos == std::string::npos)    return false;

    *out = str.substr(0, pos);
    str.erase(0, pos + sep.size());
    return true;
}

bool SplitString(const std::string& header, const std::string& sep, std::string* key, std::string* value)
{
    auto pos = header.find(sep);
    if(pos == std::string::npos)    return false;

    *key = header.substr(0, pos);
    *value = header.substr(pos+sep.size());
    return true;
}

void SetNonBlock(int sockfd)
{
    int fl = fcntl(sockfd, F_GETFL);
    if(fl < 0)  return;

    fcntl(sockfd, F_SETFL, fl | O_NONBLOCK);
}